// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式的约束
// 可以在许可证文件中找到的许可证。

package typecheck

import "cmd/compile/internal/types"

// ----------------------------------------------------------------------------
// 导出格式

// 标签。必须小于0。
const (
	// 物体
	packageTag = -(iota + 1)
	constTag
	typeTag
	varTag
	funcTag
	endTag

	// 类型
	namedTag
	arrayTag
	sliceTag
	dddTag
	structTag
	pointerTag
	signatureTag
	interfaceTag
	mapTag
	chanTag

	// 价值观
	falseTag
	trueTag
	int64Tag
	floatTag
	fractionTag // 不被gc使用
	complexTag
	stringTag
	nilTag
	unknownTag // gc未使用（仅出现在有错误的包中）

	// 类型别名
	aliasTag
)

var predecl []*types.Type // 懒散地初始化

func predeclared() []*types.Type {
	if predecl == nil {
		// 懒散地初始化以确保所有
		// 元素之前已初始化
		predecl = []*types.Type{
			// 基本类型
			types.Types[types.TBOOL],
			types.Types[types.TINT],
			types.Types[types.TINT8],
			types.Types[types.TINT16],
			types.Types[types.TINT32],
			types.Types[types.TINT64],
			types.Types[types.TUINT],
			types.Types[types.TUINT8],
			types.Types[types.TUINT16],
			types.Types[types.TUINT32],
			types.Types[types.TUINT64],
			types.Types[types.TUINTPTR],
			types.Types[types.TFLOAT32],
			types.Types[types.TFLOAT64],
			types.Types[types.TCOMPLEX64],
			types.Types[types.TCOMPLEX128],
			types.Types[types.TSTRING],

			// 基本类型别名
			types.ByteType,
			types.RuneType,

			// 错误
			types.ErrorType,

			// 非类型类型类型
			types.UntypedBool,
			types.UntypedInt,
			types.UntypedRune,
			types.UntypedFloat,
			types.UntypedComplex,
			types.UntypedString,
			types.Types[types.TNIL],

			// 包装不安全
			types.Types[types.TUNSAFEPTR],

			// 无效类型（包包含错误）
			types.Types[types.Txxx],

			// 任何类型，用于内置导出数据
			types.Types[types.TANY],
		}
	}
	return predecl
}
